package ua.org.nuos.sdms.middle.facade;

import ua.org.nuos.sdms.middle.entity.enums.Role;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Local;
import javax.ejb.Stateless;
import java.util.logging.Logger;

/**
 * Created by IntelliJ IDEA.
 * User: dio
 * Date: 20.11.11
 * Time: 12:37
 * To change this template use File | Settings | File Templates.
 */
@Local
@Stateless
@RolesAllowed({Role.client})
public class ClientBean {

    private static Logger logger = Logger.getLogger(ClientBean.class.getName());
//
//    @EJB(beanName = "UserDaoBean")
//    protected UserDaoBean userDaoBean;
//
//    @EJB(beanName = "GroupDaoBean")
//    protected GroupDaoBean groupDaoBean;
//
//    @EJB(beanName = "AuthenticationBean")
//    protected AuthenticationBean authenticationServiceBean;
//
//    private Cipher cipher;
//
//    @PostConstruct
//    public void before() {
//        cipher = CipherFactory.getCipher();
//    }
//
//    public void updateCurrentUser(User user) throws UpdateEntityException {
//        Validate.notNull(user);
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        if (currentUser.getId() != user.getId()) {
//            throw new UpdateEntityException("Can not edit another user");
//        }
//        Group lastGroup = user.getLastGroup();
//        if (lastGroup != null) {
//            boolean isInGroup = isCurrentUserInGroup(lastGroup.getId());
//            if (!isInGroup) {
//                throw new UpdateEntityException("Can not save last group if user does not attached to that group");
//            }
//        }
//        userDaoBean.update(user);
//    }
//
//    /**
//     * Change my (current user) password
//     *
//     * @param newPassword new password
//     */
//    public void changeCurrentUserPassword(String newPassword) {
//        Validate.notEmpty(newPassword);
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        String password = cipher.cipher(newPassword);
//        userDaoBean.changeCurrentUserPassword(currentUser.getId(), password);
//    }
//
//    /**
//     * Remove me (current user) from SDMS
//     * All information will be deleted !
//     */
//    public void removeCurrentUser() throws OneGroupLeaderException {
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        List<Group> groups = groupDaoBean.findUserGroups(currentUser.getId());
//        final int minLeadersInGroup = 2;
//        for (Group g : groups) {
//            Status status = g.getUsers().get(currentUser);
//            if (Status.LEADER.equals(status)) {
//                int leaderNumber = groupDaoBean.findGroupUsersByStatus(g.getId(), Status.LEADER).size();
//                if (leaderNumber < minLeadersInGroup) {
//                    throw new OneGroupLeaderException(g);
//                }
//            }
//        }
//        userDaoBean.removeAllUserRoles(currentUser.getId());
//        for (Group g : groups) {
//            groupDaoBean.detachUserFromGroup(currentUser.getId(), g.getId());
//        }
//        userDaoBean.removeUserFromGroup(currentUser.getId());
//    }
//
//    /**
//     * Create new group
//     *
//     * @param group group
//     *              entity can contains just name
//     */
//    public Group createGroup(Group group) {
//        Validate.notNull(group, "Group is NULL");
//        groupDaoBean.create(group);
//        try {
//            attachCurrentUserToGroup(group.getId(), Status.LEADER);
//        } catch (UserAlreadyInGroupException e) {
//            logger.log(Level.WARNING, "User already in group", e);
//        }
//        return group;
//    }
//
//    /**
//     * Update existing group
//     *
//     * @param group group entity
//     */
//    public void updateGroup(Group group) throws UpdateEntityException {
//        Validate.notNull(group, "Group is NULL");
//        boolean isUserGroup = isCurrentUserInGroup(group.getId());
//        if (isUserGroup) {
//            groupDaoBean.update(group);
//        } else {
//            throw new UpdateEntityException("Can not edit group if current user is not group member");
//        }
//    }
//
//    /**
//     * Find existing group by name
//     *
//     * @param groupName group name
//     * @return not null group list
//     */
//    public List<Group> findGroupByName(String groupName) {
//        return groupDaoBean.findByName(groupName);
//    }
//
//    /**
//     * Find existing group by id
//     *
//     * @param groupId group id
//     * @return not null group
//     */
//    public Group findGroupById(long groupId) {
//        return groupDaoBean.findById(groupId);
//    }
//
//    /**
//     * Find all user groups
//     *
//     * @param userId user ID
//     * @return not null group list
//     */
//    public List<Group> findUserGroups(long userId) {
//        return groupDaoBean.findUserGroups(userId);
//    }
//
//    public List<User> findGroupUsers(long groupId) {
//        return groupDaoBean.findGroupUsers(groupId);
//    }
//
//    /**
//     * Find all my (current user) groups
//     *
//     * @return not null group list
//     */
//    public List<Group> findCurrentUserGroups() {
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        return groupDaoBean.findUserGroups(currentUser.getId());
//    }
//
//    /**
//     * Find all groups
//     *
//     * @return not null group list
//     */
//    public List<Group> findAllGroups() {
//        return groupDaoBean.findAllGroups();
//    }
//
//    /**
//     * Find groups by parameters
//     *
//     * @param search parameters container
//     * @return not null group list
//     */
//    public List<Group> findGroup(GroupSearch search) {
//        return groupDaoBean.findGroup(search);
//    }
//
//    public Status findCurrentUserInGroupStatus(long groupId) {
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        return findUserGroupType(currentUser.getId(), groupId);
//    }
//
//    public Status findUserGroupType(long userId, long groupId) {
//        return groupDaoBean.findUserInGroupStatus(userId, groupId);
//    }
//
//    /**
//     * Remove existing group
//     *
//     * @param groupId group id
//     */
//    public void removeGroup(long groupId) throws NotGroupLeaderException {
//        Status status = findCurrentUserInGroupStatus(groupId);
//        if (Status.LEADER.equals(status)) {
//            List<User> users = groupDaoBean.findGroupUsers(groupId);
//            for (User u : users) {
//                groupDaoBean.detachUserFromGroup(u.getId(), groupId);
//            }
//            groupDaoBean.removeGroup(groupId);
//        } else {
//            throw new NotGroupLeaderException("Can not removeUserFromGroup group if current user is not group leader");
//        }
//    }
//
//    public boolean isCurrentUserInGroup(long groupId) {
//        Status status = findCurrentUserInGroupStatus(groupId);
//        return status != null;
//    }
//
//    /**
//     * Add existing user to existing group
//     *
//     * @param groupId group id
//     */
//    public void attachCurrentUserToGroup(long groupId, Status status) throws UserAlreadyInGroupException {
//        Validate.isTrue(groupId > 0);
//        Validate.notNull(status);
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        Status oldStatus = groupDaoBean.findUserInGroupStatus(currentUser.getId(), groupId);
//        if (oldStatus == null) {
//            groupDaoBean.attachCurrentUserToGroup(currentUser.getId(), groupId, status);
//        } else {
//            throw new UserAlreadyInGroupException();
//        }
//    }
//
//    /**
//     * Remove existing user from existing group
//     *
//     * @param userId  user email
//     * @param groupId group id
//     */
//    public void detachUserFromGroup(long userId, long groupId) {
//        Status status = findCurrentUserInGroupStatus(groupId);
//        if (Status.LEADER.equals(status)) {
//            groupDaoBean.detachUserFromGroup(userId, groupId);
//        }
//    }
//
//    /**
//     * Remove me (current user) from existing group
//     *
//     * @param groupId group id
//     */
//    public void detachCurrentUserFromGroup(long groupId) throws UpdateEntityException, OneGroupLeaderException {
//        User currentUser = authenticationServiceBean.getCurrentUser();
//        Status status = findCurrentUserInGroupStatus(groupId);
//        if (Status.LEADER.equals(status)) {
//            final int minLeadersInGroup = 2;
//            int leaderNumber = groupDaoBean.findGroupUsersByStatus(groupId, Status.LEADER).size();
//            if (leaderNumber < minLeadersInGroup) {
//                throw new OneGroupLeaderException(groupDaoBean.findById(groupId));
//            }
//        }
//
//        groupDaoBean.detachUserFromGroup(currentUser.getId(), groupId);
//    }
//
//    public void updateUserInGroupStatus(long userId, long groupId, Status status) throws UpdateEntityException {
//        Status currentUserStatus = findCurrentUserInGroupStatus(groupId);
//        if (Status.LEADER.equals(currentUserStatus)) {
//            groupDaoBean.attachCurrentUserToGroup(userId, groupId, status);
//        }
//    }
}
